package com.guang.springbootrequestversion.config;

import com.guang.springbootrequestversion.bean.Cat;
import com.guang.springbootrequestversion.bean.Tom;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author liguang
 * @date 2022/5/10 10:51
 */

/**
 * 代理bean的方法
 * boolean proxyBeanMethods() default true; 自动开启了cglib的动态代理，外部每次来从容器中来获取得到对象都是一样的
 * boolean proxyBeanMethods() default false; 不开启，那么每次获取得到bean都是新的；
 *
 * 这里的也可以通过Spring.getBean(MyConfig.class)，然后得到bean，通过bean来多次调用cat或者是tom方法
 * 观察发现得到的对象最终的值是否是一样的
 *
 *
 * 调整proxyBeanMethods为true和false之后，可以看到MyConfig对象也发生了变化，这里使用了cglib动态代理
 */
@Configuration(proxyBeanMethods = false)
public class MyConfig {

    @Bean
    public Cat cat(){
        Cat cat = new Cat();
        // 将proxyBeanMethods = false，将会多调用一次
        System.out.println(cat.hashCode()); // 2047744862 boolean proxyBeanMethods() default true
        return cat;
    }

//    @Bean
//    public Tom tom(){
//        Tom tom = new Tom();
//         Cat cat = cat(); // 2047744862 boolean proxyBeanMethods() default true
//        tom.setCat(cat);
//        System.out.println(cat.hashCode());
//        return tom;
//    }

    @Bean
    public Tom tom(){
        Tom tom = new Tom();  // proxyBeanMethods = false
        System.out.println("..........");
        Cat cat = cat();   // // 679449777，其实是调用cat方法重新获取得到的对象。这里不会从容器中来获取，而是创建新的对象来获取得到。
        tom.setCat(cat);
        System.out.println(cat.hashCode()); // 679449777
        return tom;
    }



}
